﻿package CutLoad.components.container
{
	import CutLoad.Base;
	import CutLoad.CutLoad;
	import CutLoad.cookies.CArray;
	
	import flash.display.Sprite;

	/**
	 * 垂直布局容器 
	 * @author smallerbird mail:smallerbird@gmail.com  site:www.mkigm.com QQ群:49983196
	 * 
	 */
	public class ContainerV extends Container
	{
		////列距,行距
		private var xspace:Number,yspace:Number
		private var isAuto:Boolean;
		//
		private var arrH:CArray=new CArray();
		
		protected var iniObjForClone:Object;
		
		/**
		 * 获得一个 默认配置的容器
		 * @param obj 参数详见ContainerH.init()说明
		 * @return 
		 * 
		 */		
		public static function getSimple(obj:Object=null):ContainerV{
			var cc:ContainerV=new ContainerV();
			cc.init(obj);
			return cc;
		}
		/**
		 * 请一组元素放在垂直布局容器，并返回这个容器。 如果只是需要一个简单的垂直布局，调用这个方法会省很多事情
		 * @param arrBase 包括有元素的数组
		 * @param space 行距
		 * @param showParent 该容器显示的父对象
		 * @param xx 位置x
		 * @param yy 位置y
		 * @return 
		 * 
		 */		
		public static function getSimpleAppendSomeChildren(arrBase:Array,space:Number,showParent:Sprite=null,xx:Number=-10000,yy:Number=-10000):ContainerV{
			var cc:ContainerV=new ContainerV();
			cc.init({w:0,h:0,isAuto:false,xspace:0,yspace:space});
			cc.appendSome(arrBase);
			if(showParent!=null) showParent.addChild(cc);
			if(xx!=-10000) cc.x=xx;
			if(yy!=-10000) cc.y=yy;
			return cc;
		}
		public function ContainerV()
		{
		}
		/**
		 * 
		 * @param obj  {w:宽,h:高,isAuto:是否自动适应,xspace:列距,yspace:行距}  注：isAuto如果设置为false，如果默认设置的宽度不够的话，会被撑大。true则，添加的元件会自动换行
		 * 默认为：{w:10,h:10,isAuto:false,xspace:5,yspace:5}
		 * @return 
		 * 
		 */	
		override public function init(obj:Object=null):void{
			if(obj==null) obj={w:10,h:10,isAuto:false,xspace:5,yspace:5};
			iniObjForClone=obj;
			if(obj.isAuto==null) obj.isAuto==false;
			if(obj.xspace==null) obj.xspace=0;
			if(obj.yspace==null) obj.yspace=0;
			super.init(obj);
			isAuto=obj.isAuto;
			xspace=obj.xspace
			yspace=obj.yspace
		}
		/**
		 * 克隆
		 * @return 
		 * 
		 */		
		public function clone():ContainerV{
			var ctem:ContainerV=new ContainerV();
			ctem.init(iniObjForClone);
			return ctem;
		}
		/**
		 * 一次添加多个 
		 * @param arr
		 * @param isSetTakeWH 是否调用setTakeWH() 方法进行匹配长宽 
		 * 
		 */		
		public function appendSome(arr:Array,isSetTakeWH:Boolean=true):void{
			for(var i:Number=0;i<arr.length;i++){
				append(arr[i],(i==arr.length-1?true:false));
			}
			if(isSetTakeWH) this.setTakeWH();
		}
		/**
		 * 添加一个元素
		 * @param base
		 * @param isUpdate  见Container.append 说明
		 * @param obj 如果保留空值，添加地元件将垂直排列，否则，请按照Container.append的方法设置。 
		 */		
		override public function append(base:Base, isUpdate:Boolean=true,obj:Object=null):void{
			if(obj!=null){
				super.append(base,isUpdate,obj);
			}else{
				obj={x:0,y:0}
				base.visible=false;
				spContent.addChild(base);
				arrH.add(base);
			}
			if(isUpdate) update()
		}
		override public function delChild(base:Base):Boolean{
			if(arrH.del(base)){
				base.killMe();
				base=null;
				this.update();
				return true;
			}else{
				return super.delChild(base);
			}
		}
		/** 
		 * 获得设置垂直的子元素的 Group，可以从这里可以获得子元素 
		 * @return 
		 * 
		 */		
		public function getVChildeParent():CArray{
			return arrH
		}
		/**
		 * 清除所有的 
		 * 
		 */		
		override public function removeAll():void{
			super.removeAll();
			arrH=new CArray();
		}
		override public function getShowHeight():Number{
			return this.getTakeHeight()
		}
		override public function getShowWidth():Number{
			return this.getTakeWidth()
		}
		/**
		 * 刷新 
		 * 
		 */		
		override public function update():void{
			super.update();
			var arrTem:Array=arrH.data
			var temMaxH:Number=0,temMaxW:Number=0;
			var temE:Base,currentTemE:Base;
			var temx:Number,temy:Number;
			
			var objTem:Object
			var xxTem:Number
			var yyTem:Number
			
			if(isAuto){
				var isHang:Boolean=false
				var numTemYLen:Number=0;
				temx=this.xspace;
				//
				var temEMaxWidth:Base=null;
				for(i=0;i<arrTem.length;i++){
					temE=arrTem[i];
					if(i==0){
						temx=xspace<0?0:xspace
						temy=yspace<0?0:yspace
						currentTemE=temE;
						numTemYLen=yspace+temE.getShowHeight();
						temEMaxWidth=temE;
					}else{
						numTemYLen+=yspace+temE.getShowHeight();
						if(numTemYLen<=this.getShowHeight()){		
							temy=arrTem[i-1].getXYLeftDown().y+yspace;
							if(temEMaxWidth==null){
								temEMaxWidth=temE;
							}else{
								if(temEMaxWidth.getShowWidth()<temE.getShowWidth()){
									temEMaxWidth=temE
								}
							}
						}else{
							isHang=true;
							numTemYLen=yspace+temE.getShowHeight();
							temy=yspace
							temx=temEMaxWidth.getXYRightUp().x+xspace;
							temEMaxWidth=temE;
							currentTemE=temE;
							//
						}
					}
					temE.setXY(temx,temy)
					temE.visible=true;
					
					objTem=temE.getXYRightDown();
					xxTem=objTem.x+this.xspace;
					yyTem=objTem.y+this.yspace;
					if(temMaxW<xxTem) temMaxW=xxTem;
					if(temMaxH<yyTem) temMaxH=yyTem;
				}
			}else{
				for(var i:Number=0;i<arrTem.length;i++){
					temE=arrTem[i];
					if(i==0){
						temy=yspace<0?0:yspace
					}else{
						temy=arrTem[i-1].getXYLeftDown().y+yspace
					}
					temE.setXY(xspace,temy)
					temE.visible=true;
					
					objTem=temE.getXYRightDown();
					xxTem=objTem.x+this.xspace;
					yyTem=objTem.y+this.yspace;
					if(temMaxW<xxTem) temMaxW=xxTem;
					if(temMaxH<yyTem) temMaxH=yyTem;
				}
			}
			
			this.takeWidth=temMaxW;
			this.takeHeight=temMaxH;
		}

	}
}